package br.com.sismo.server.dao.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.jdo.Query;

import br.com.sismo.server.entity.Curso;
import br.com.sismo.shared.CursoTO;

public class CursoDAOImpl extends DAOImpl {
	public CursoDAOImpl() {
		super();
	}

	public Curso findById(Long id) {
		return (Curso) this.pm.getObjectById(Curso.class, id);
	}	
	
	public List<Long> getAlunos(Long id) {
		return ((Curso) this.pm.getObjectById(Curso.class, id)).getAlunos();
	}
	
	@SuppressWarnings("unchecked")
	public List<CursoTO> findByNome(String nome) {
		// query para a classe Curso
		Query query = this.pm.newQuery(Curso.class);
		// WHERE clause( o campo nome tem que ser igual ao parametro nomeParam )
		query.setFilter("nome == nomeParam");
		// indico qual o tipo do parametro 'nomeParam'
		query.declareParameters("String nomeParam");
		// executo a query passando o parametro
		List<Curso> cu = (List<Curso>) query.execute(nome);
		return converteParaCursoTO(this.pm.detachCopyAll(cu));
	}	
	public void persist(Curso c) {
		pm.currentTransaction().begin();
		pm.makePersistent(c);
		pm.currentTransaction().commit();
	}
	@SuppressWarnings("unchecked")
	public List<CursoTO> findAll() {
		Query query = this.pm.newQuery("select from "+Curso.class.getName());
		List<Curso> cu = (List<Curso>) query.execute();
		return converteParaCursoTO(this.pm.detachCopyAll(cu));
	}
	private List<CursoTO> converteParaCursoTO(Collection<Curso> cu) {
		List<CursoTO> cursos = new ArrayList<CursoTO>();
		for(Curso c : cu) {
			cursos.add(c.getCursoTO());
		}
		return cursos;
	}
	@SuppressWarnings("unchecked")
	public int numCursos() {
		Query query = this.pm.newQuery("select from "+Curso.class.getName());
		List<Curso> us = (List<Curso>) query.execute();
		return us.size();
	}
	
	public void removeCurso(Long id) {
		Curso c = this.findById(id);
		if(c == null) {
			return;
		}
		this.pm.currentTransaction().begin();
		this.pm.deletePersistent(c);
		this.pm.currentTransaction().commit();
	}
}

